/* ************************************************************************
> File Name:     test.cpp
> Created Time:  Thu 07 Sep 2023 06:37:16 PM CST
> Description:
 ************************************************************************/
#define DEBUG_LOG
#include "hot_manage.hpp"
#include "service.hpp"
#include <thread>
using namespace std;
using sw::redis::Redis;

const char *host = NULL;
const char *user = "root";
const char *passwd = NULL;
const char *db = "cloud_backup";
unsigned int port = 0;
const char *unix_socket = NULL;
unsigned long clientflag = 0;

const char* uri = "tcp://127.0.0.1:6379";

cloud::DataManager *data_;
MYSQL *mysql_;
Redis *redis_;

void mysql_module()
{
    mysql_ = mysql_init(NULL);
    if (mysql_real_connect(mysql_, host, user, passwd, db, port, unix_socket, clientflag) == NULL)
        xqlog::GetLogger("asynclogger")->Error("mysql connect error");
    mysql_set_character_set(mysql_, "utf8"); // 设置默认字符集
}
void redis_module(){
    xqlog::GetLogger("asynclogger")->Info("redis-server start");
    redis_ = new Redis(uri);
}
void service_module()
{
    cloud::service s;
    xqlog::GetLogger("asynclogger")->Info("service step in RunModule");
    s.RunModule();
}
void hot_module()
{
    cloud::HotManager hot;
    xqlog::GetLogger("asynclogger")->Info("hot_manager step in RunModule");
    hot.RunModule();
}
void log_system_module(xqlog::Logger::ptr &logger)
{
    // 注意，写日志线程会等缓冲区满了才会写
    std::shared_ptr<xqlog::LoggerBuilder> Glb(new xqlog::GlobalLoggerBuilder());
    Glb->BuildLoggerFormatter("[%c][%p][%f-%l]%T%m%n");
    Glb->BuildLoggerName("asynclogger");
    Glb->BuildLoggerType(xqlog::LoggerType::ASYNCLOGGER);
    Glb->BuildLoggerSink<xqlog::RollFileSink>("./logfile/logfile.log", 1024 * 1024);
    logger = Glb->Build();
}
int main()
{
    xqlog::Logger::ptr logger;
    thread t1(log_system_module, std::ref(logger));
    while (!logger)
        ;
    // log_system_module();
    data_ = new cloud::DataManager();

    thread t2(mysql_module);
    thread t3(service_module);
    thread t4(hot_module);
    thread t5(redis_module);

    mysql_close(mysql_);
    t1.join();
    t2.join();
    t3.join();
    t4.join();
    t5.join();
    return 0;
}

// void test(char *file)
// {
// cloud::FileUtil fu(file);
// cout<<fu.FileName()<<endl;
// cout<<fu.FileSize()<<endl;
// cout<<fu.LastModifyTime()<<endl;
// cout<<fu.LastAccessTime()<<endl;
// cloud::FileUtil f(file);
// std::string body;
// f.GetPosLen(&body, 4, 10);
// std::cout << body << std::endl;
// cout<<1<<endl;
// f.GetContent(&body);
// std::cout << body << std::endl;
// cloud::FileUtil f(file);
// string body;
// f.GetContent(&body);
// cloud::FileUtil nf("./hello.txt");
// nf.SetContent(&body);
// f.SetContent(&body);
// cloud::FileUtil f(file);
// f.Compress("a.txt.zip");
//  cloud::FileUtil nf("a.txt.zip");
//  nf.UnCompress("a");
//    cloud::FileUtil f(file);
//    f.CreateDirectory();
//    std::vector<std::string> v;
//    f.ScanDirectory(&v);
//    for (auto e : v)
//    {
//        std::cout << e << std::endl;
//    }
// }
// void JsonTest()
// {
//    Json::Value root;
//    const char *name = "小明";
//    int age = 18;
//    int arr[] = {1, 2};
//    root["name"] = "xiaoming";
//    root["age"] = 18;
//    root["成绩"].append(1);
//    root["成绩"].append(2);
//    std::string out;
//    cloud::JsonUtil::Serialize(root, &out);
//    cout << out << endl;
//    root.clear();
//    cloud::JsonUtil::UnSerialize(out, &root);
//    cout << root["name"] << endl;
//    cout << root["age"] << endl;
//    cout << root["成绩"][0] << endl;
//    cout << root["成绩"][1] << endl;
// }

// void configTest()
// {
//    cloud::Config* cf = cloud::Config::GetInstance();
//    cout<<cf->GetHotTime()<<endl;
//    cout<<cf->GetPackDir()<<endl;
//    cout<<cf->GetPackSuffix()<<endl;
//    cout<<cf->GetServerPort()<<endl;
//    cout<<cf->GetServerIp()<<endl;
//    cout<<cf->GetDownloadPrefix()<<endl;
//    cout<<cf->GetBackDir()<<endl;
// }

// void dataTest(const string &filename)
// {
//    cloud::BackupInfo b;
//    b.NewBackupInfo(filename);
//    cloud::DataManager dm;
//    dm.Insert(b);
//    cloud::BackupInfo tmp;
//    cout<<"--------Get by url ------------"<<endl;
//    dm.GetOneByURL("/download/bundle.h",&tmp);
//    cout<<tmp.pack_flag_<<endl;
//    cout<<tmp.mtime_<<endl;
//    cout<<tmp.atime_<<endl;
//    cout<<tmp.fsize_<<endl;
//    cout<<tmp.url_<<endl;
//    cout<<tmp.realpath_<<endl;
//    cout<<tmp.packpath_<<endl;
//
//    b.pack_flag_=1;
//    tmp.pack_flag_=1;
//    dm.Update(b);
//
//    cout<<"--------Get by realpath ------------"<<endl;
//    dm.GetOneByRealPath(filename,&tmp);
//    cout<<tmp.pack_flag_<<endl;
//    cout<<tmp.mtime_<<endl;
//    cout<<tmp.atime_<<endl;
//    cout<<tmp.fsize_<<endl;
//    cout<<tmp.url_<<endl;
//    cout<<tmp.realpath_<<endl;
//    cout<<tmp.packpath_<<endl;
//
//    cout<<"--------Get by all ------------"<<endl;
//    vector<cloud::BackupInfo> arr;
//    dm.GetAll(&arr);
//    cout<<arr[0].pack_flag_<<endl;
//    cout<<arr[0].mtime_<<endl;
//    cout<<arr[0].atime_<<endl;
//    cout<<arr[0].fsize_<<endl;
//    cout<<arr[0].url_<<endl;
//    cout<<arr[0].realpath_<<endl;
//    cout<<arr[0].packpath_<<endl;
// cloud::BackupInfo info;
// info.NewBackupInfo(filename); // 新建指定文件备份信息
// cloud::DataManager dm;
// dm.Insert(info); // 插入备份信息，此时备份文件信息已经持久化到文件
// cloud::HotManager hm;
// hm.RunModule(); // 持续更新hot文件信息
//   dm.GetAll(&arr);
//   cout<<arr[0].pack_flag_<<endl;
//   cout<<arr[0].mtime_<<endl;
//   cout<<arr[0].atime_<<endl;
//   cout<<arr[0].fsize_<<endl;
//   cout<<arr[0].url_<<endl;
//   cout<<arr[0].realpath_<<endl;
//   cout<<arr[0].packpath_<<endl;
// }
// void UtilTest(){
//     Json::Value item;
//     item["pack_flag_"]= "asd ";
//     std::string body;
//     cloud::JsonUtil::Serialize(item,&body);
//     cloud::FileUtil f("./c.dat");
//     f.SetContent(&body);
// }
